前一篇我們提到 ReplicaSet 來管理 pods。
假使為了讓應用程式 HA 及負載平衡,使用 ReplicaSet 部署 5 個 pods。一切看似沒問題,若之後開發工程師發佈應用程式的第二版,如何使 ReplicaSet 中的 pods 自動更新為 v2?
Deployment 用於部署及管理一組 pods(應用服務),提供更新(upgrade)及倒回舊版或稱回滾?(rollback)的功能,讓管理者能更輕易對部署的應用程式進行管理。
Deployment 的功能:
recreate
:終止舊版本的 instance 後再建立新版本的 instancerolling update
:逐步建立一個新版本的 instance、終止一個舊版本的 instance,不將所有 instances 一次都換成新版,確保程式提供的服務不中斷,目的是提供應用服務 zero downtime (零停機更新)在建立 deployment 時,預設會建立一個 replicaset,並依照設定檔中的 replicas
來維持當前所需數量的 pods。
在部署應用程式時,直接透過 deployment 來定義程式需要幾個 replicas
、pods
template
及程式版本更新要如何進行,不需另外去建立 replicaset 與 pod 設定。
中文稱為「滾動更新」,滾動更新是一種將應用程式從舊版本更新到新版本的方法,同時確保應用程式的可用性和效能。
建立一個 deployment 時,會觸發 rollout,rollout 會建立一個新的 deployment revision,稱為 Revision 1。當應用程式更新後,新的 rollout 會被觸發、建立一個新的 revision,稱為 Revision 2。Deployment 透過這種機制可以幫助我們去追蹤及倒回之前的版本。
rollout 提供的好處:
接下來進行的操作有:
底下為 nginx-deploy.yaml
,deployment 與 replicaset 差別在於 kind: Deployment
,其他內容幾乎相同。
將 replicas
設定為 3,並透過 labels:
中的 app:my-app
來連結 pods。一樣是用 nginx
來作為 image。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx:1.20.0
ports:
- containerPort: 80
kubectl apply -f nginx-deploy.yaml
deployment.apps/nginx-deploy created
查看 deployment。
kubectl get deploy nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 3/3 3 3 47s
查看 deployment 建立的 replicaset 與 pods。
kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deploy-65b6d5d9d9 3 3 3 59s
kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-deploy-65b6d5d9d9-4qhdq 1/1 Running 0 71s
nginx-deploy-65b6d5d9d9-nlwx6 1/1 Running 0 71s
nginx-deploy-65b6d5d9d9-pzr85 1/1 Running 0 71s
使用 kubectl describe
觀察 deployment,可以看到 StrategyType
預設為 RollingUpdate
,及 Events
裡的 Scaled up replica set 事件。
kubectl describe deploy nginx-deploy
Name: nginx-deploy
Namespace: default
CreationTimestamp: Mon, 25 Sep 2023 23:18:13 +0800
Labels: app=my-app
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=my-app
Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=my-app
Containers:
nginx:
Image: nginx:1.20.0
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-deploy-65b6d5d9d9 (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 82s deployment-controller Scaled up replica set nginx-deploy-65b6d5d9d9 to 3
下一篇則接續 upgrade、rollback 與刪除 deployment 的操作。